Реализовать тайловую карту С++ на Qt.

Основная идея задания - реализовать многопоточное выполнение задач через единый интерфейс наподобие task-based executor, за которым скрывается очередь задач с несколькими фоновыми потоками для исполнения.

* В качестве заготовки воспользуйтесь [материалами из репозитория курса](https://github.com/ivafanas/cpp_shad_students/tree/master/2021/sem2/lab2_stub)
* Возьмите картинку из репозитория курса и какой-нибудь внешней программой разбейте на файлы сеткой 10х10
  * в итоге должно получиться 100 файлов прямоугольных картинок
  * имена картинкам выберите самостоятельно
* UI:
  * поле ввода для числа фоновых потоков-обработчиков
  * checkbox на включение-выключение throttling-а
  * кнопка `relaunch` для перезапуска модели сначала
* Нужно поддержать скролл мышкой, чтобы колёсико мыши позволяло делать zoom карты. Сделайте ограничение на самый далёкий и самый близкий zoom.
* Рисоваться в каждый момент должны только видимые тайлы
* Невидимые тайлы должны не рисоваться и не занимать место в оперативной памяти
* Никаких сложных работ не должно происходить в UI потоке. В UI потоке разрешено сделать только одну тяжёлую задачу - отрисовку
* Построение каждого тайла - отдельная задача, которая выполняет чтение тайла с файловой системы
* Тайлы должны строится в фоновом потоке. В случае, если включен throttling, задача на тайл должна уходить в sleep на случайное время от 300 мс до 1 сек.
* Кнопка `relaunch` должна перезапускать отрисовку с новыми параметрами (другое число потоков, throttling on/off)
* примитивы синхронизаций / потоки должны быть стандартными, не qt-выми
* Фоновые потоки у threadpool join-ить, когда они больше не нужны

Прочие замечания:

* `QPixmap` [может не работать](https://doc.qt.io/qt-5/thread-basics.html#gui-thread-and-worker-thread) в фоновых потоках, попробуйте посмотреть в сторону `QImage` ([документация QImage](https://doc.qt.io/qt-5/qimage.html), [документация про работу с QImage в фоновых потоках](https://doc-snapshots.qt.io/qt5-5.9/qtcore-threads-queuedcustomtype-example.html))

Добавить требование для следующих групп:

* Executor для задач должен работать с произвольными задачами, он не должен знать, что ему на вход подают именно загрузку тайлов

